"""
配置管理模块

管理API配置、环境变量和应用设置。
"""

import os
from typing import Optional
from dataclasses import dataclass
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()


@dataclass
class Config:
    """
    应用配置类
    
    管理API密钥、基础URL、模型参数等配置信息。
    """
    
    api_base: str
    api_key: str
    model_name: str
    temperature: float = 0.6
    max_retries: int = 2
    request_timeout: int = 120
    max_tokens: int = 10000
    streaming: bool = False
    
    @classmethod
    def from_env(cls) -> "Config":
        """
        从环境变量创建配置实例
        
        Returns:
            Config: 配置实例
            
        Raises:
            ValueError: 当必需的环境变量缺失时
        """
        api_base = os.getenv("API_BASE", "https://api.360.cn/v1")
        api_key = os.getenv("API_KEY")
        model_name = os.getenv("MODEL_NAME", "anthropic/claude-3.7-sonnet")
        
        if not api_key:
            raise ValueError("API_KEY环境变量必须设置")
        
        return cls(
            api_base=api_base,
            api_key=api_key,
            model_name=model_name,
            temperature=float(os.getenv("TEMPERATURE", "0.6")),
            max_retries=int(os.getenv("MAX_RETRIES", "2")),
            request_timeout=int(os.getenv("REQUEST_TIMEOUT", "120")),
            max_tokens=int(os.getenv("MAX_TOKENS", "10000")),
            streaming=os.getenv("STREAMING", "false").lower() == "true"
        )
    
    @classmethod
    def get_default(cls) -> "Config":
        """
        获取默认配置（用于用户提供的参数）
        
        Returns:
            Config: 默认配置实例
        """
        return cls(
            api_base="https://api.360.cn/v1",
            api_key="xxx",
            model_name="anthropic/claude-3.7-sonnet",
            temperature=0.6,
            max_retries=2,
            request_timeout=120,
            max_tokens=10000,
            streaming=False
        )
    
    def validate(self) -> None:
        """
        验证配置的有效性
        
        Raises:
            ValueError: 当配置无效时
        """
        if not self.api_key:
            raise ValueError("API密钥不能为空")
        
        if not self.api_base:
            raise ValueError("API基础URL不能为空")
        
        if not self.model_name:
            raise ValueError("模型名称不能为空")
        
        if not 0 <= self.temperature <= 2:
            raise ValueError("温度参数必须在0-2之间")
        
        if self.max_tokens <= 0:
            raise ValueError("最大令牌数必须大于0")
        
        if self.request_timeout <= 0:
            raise ValueError("请求超时时间必须大于0")
